--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_auto_announce_schedule.py v4.7.0-rc.2 (a20c7e1c) Text, 3.56 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Regression tests for auto-announce and periodic interval scheduling (config / DB time)."""
Tff7b72import T7ee787pytest
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787meshchat_utils Tff7b72import Te6edf3interval_action_due
Tff7b72class T56d364TestIntervalActionDueTb4b4b4:
Tff7b72def Td2a8fftest_disabled_never_firesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff3600Tb4b4b4, T79c0ff1_000_000.0Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Tff7b72FalseTb4b4b4, T79c0ff1Tb4b4b4, T79c0ff3600Tb4b4b4, T79c0ff1_000_000.0Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_zero_or_negative_interval_never_fires_even_if_enabledTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Tff7b72TrueTb4b4b4, T79c0ff100Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff200.0Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Tff7b72TrueTb4b4b4, T79c0ff100Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4, T79c0ff200.0Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Tff7b72TrueTb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff200.0Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_none_interval_treated_as_zeroTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Tff7b72TrueTb4b4b4, T79c0ff100Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff500.0Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_first_run_when_last_at_is_noneTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Tff7b72TrueTb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff900Tb4b4b4, T79c0ff1.0Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_due_when_past_next_boundaryTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3now Tff7b72= T79c0ff1_000_000.0
Te6edf3last Tff7b72= Tffa657intTb4b4b4(Te6edf3now Tff7b72- T79c0ff1000Tb4b4b4)
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Tff7b72TrueTb4b4b4, Te6edf3lastTb4b4b4, T79c0ff900Tb4b4b4, Te6edf3nowTb4b4b4) Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_not_due_inside_intervalTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3now Tff7b72= T79c0ff1_000_000.0
Te6edf3last Tff7b72= Tffa657intTb4b4b4(Te6edf3now Tff7b72- T79c0ff100Tb4b4b4)
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Tff7b72TrueTb4b4b4, Te6edf3lastTb4b4b4, T79c0ff900Tb4b4b4, Te6edf3nowTb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_future_last_at_treated_as_due_regressionTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Stale future timestamps (clock skew, restored DB) must not stall the loop."""
Te6edf3now Tff7b72= T79c0ff1_000_000.0
Te6edf3last Tff7b72= Tffa657intTb4b4b4(Te6edf3now Tff7b72+ T79c0ff86_400Tb4b4b4)
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Tff7b72TrueTb4b4b4, Te6edf3lastTb4b4b4, T79c0ff3600Tb4b4b4, Te6edf3nowTb4b4b4) Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_boundary_exclusiveTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3now Tff7b72= T79c0ff1_000_000.0
Te6edf3last Tff7b72= Tffa657intTb4b4b4(Te6edf3now Tff7b72- T79c0ff900Tb4b4b4)
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Tff7b72TrueTb4b4b4, Te6edf3lastTb4b4b4, T79c0ff900Tb4b4b4, Te6edf3nowTb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Tff7b72TrueTb4b4b4, Te6edf3lastTb4b4b4, T79c0ff900Tb4b4b4, Te6edf3now Tff7b72+ T79c0ff0.001Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_propagation_sync_equivalent_enabled_flagTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3interval Tff7b72= T79c0ff600
Te6edf3now Tff7b72= T79c0ff500_000.0
Te6edf3last Tff7b72= Tffa657intTb4b4b4(Te6edf3now Tff7b72- T79c0ff601Tb4b4b4)
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Te6edf3interval Tff7b72> T79c0ff0Tb4b4b4, Te6edf3lastTb4b4b4, Te6edf3intervalTb4b4b4, Te6edf3nowTb4b4b4) Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_large_interval_last_at_slightly_in_future_ntpTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Small positive skew still triggers one correction announce."""
Te6edf3now Tff7b72= T79c0ff1_000_000.0
Te6edf3last Tff7b72= Tffa657intTb4b4b4(Te6edf3now Tff7b72+ T79c0ff2Tb4b4b4)
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Tff7b72TrueTb4b4b4, Te6edf3lastTb4b4b4, T79c0ff3600Tb4b4b4, Te6edf3nowTb4b4b4) Tff7b72is Tff7b72True
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffparametrizeTb4b4b4(
Tb4b4b4(Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflastTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffintervalTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnowTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffexpectedTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4[
Tb4b4b4(Tff7b72TrueTb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff60Tb4b4b4, T79c0ff0.0Tb4b4b4, Tff7b72TrueTb4b4b4)Tb4b4b4,
Tb4b4b4(Tff7b72TrueTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff60Tb4b4b4, T79c0ff61.0Tb4b4b4, Tff7b72TrueTb4b4b4)Tb4b4b4,
Tb4b4b4(Tff7b72TrueTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff60Tb4b4b4, T79c0ff60.0Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4,
Tb4b4b4(Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff60Tb4b4b4, T79c0ff999.0Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_interval_action_due_tableTb4b4b4(Te6edf3enabledTb4b4b4, Te6edf3lastTb4b4b4, Te6edf3intervalTb4b4b4, Te6edf3nowTb4b4b4, Te6edf3expectedTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3interval_action_dueTb4b4b4(Te6edf3enabledTb4b4b4, Te6edf3lastTb4b4b4, Te6edf3intervalTb4b4b4, Te6edf3nowTb4b4b4) Tff7b72is Te6edf3expected
Tff7b72def Td2a8fftest_last_announced_at_config_roundtrip_dbTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
T8b949e"""Config table stores last_announced_at; invalid strings fall back to default."""
Tff7b72import T7ee787os
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787config_manager Tff7b72import Te6edf3ConfigManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787database Tff7b72import Te6edf3Database
Te6edf3db_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffc.dbTa5d6ff"
Te6edf3database Tff7b72= Te6edf3DatabaseTb4b4b4(Tffa657strTb4b4b4(Te6edf3db_pathTb4b4b4)Tb4b4b4)
Te6edf3databaseTff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3cfg Tff7b72= Te6edf3ConfigManagerTb4b4b4(Te6edf3databaseTb4b4b4)
Te6edf3cfgTff7b72.Td2a8fflast_announced_atTff7b72.Td2a8ffsetTb4b4b4(T79c0ff1_700_000_000Tb4b4b4)
Tff7b72assert Te6edf3cfgTff7b72.Td2a8fflast_announced_atTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72== T79c0ff1_700_000_000
Te6edf3cfg2 Tff7b72= Te6edf3ConfigManagerTb4b4b4(Te6edf3databaseTb4b4b4)
Tff7b72assert Te6edf3cfg2Tff7b72.Td2a8fflast_announced_atTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72== T79c0ff1_700_000_000
Te6edf3databaseTff7b72.Td2a8ffconfigTff7b72.Td2a8ffsetTb4b4b4(Ta5d6ff"Ta5d6fflast_announced_atTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnot-an-intTa5d6ff"Tb4b4b4)
Te6edf3cfg3 Tff7b72= Te6edf3ConfigManagerTb4b4b4(Te6edf3databaseTb4b4b4)
Tff7b72assert Te6edf3cfg3Tff7b72.Td2a8fflast_announced_atTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72finallyTb4b4b4:
Te6edf3databaseTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3db_pathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3db_pathTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────